package com.yuw.arr;

import java.util.Arrays;

public class TestDriver02 {
    public static void main(String[] args) {

        int a = 10;
        char ch = 'a';
        char ch1 = (char) (ch + a);  // 如果运算表达式中只有byte、short、char类型，则运算结果为int类型；【特殊情况】
        System.out.println("ch1=" + ch1);


        // 冒泡排序算法
        test01();
        System.out.println("-------------------------------------");
        test02();
        System.out.println("-------------------------------------");
        test03();
        System.out.println("-------------------------------------");
        test04();
        System.out.println("-------------------------------------");
        test05();
    }

    /**
     * 使用数组工具类进行排序 Arrays 进行数组复制（扩容）
     */
    public static void test05() {
        // 定义一个被排序的数组
        int[] arr = {3, 6, 1, 9, 4, 5, 7};
        System.out.println("扩容之前的数组：");
        printArr(arr);
        // 使用Arrays工具类进行数组复制扩容
        int[] arr1 = Arrays.copyOf(arr, 14);
        System.out.println("扩容之后的数组：");
        printArr(arr1);
    }


    /**
     * 使用数组工具类进行排序 Arrays 进行排序
     */
    public static void test04() {
        // 定义一个被排序的数组
        int[] arr = {3, 6, 1, 9, 4, 5, 7};
        //int[] arr = {1, 3, 4, 5, 6, 7, 9};
        System.out.println("冒泡排序之前的数组：");
        printArr(arr);
        // 使用Arrays工具类进行排序
        Arrays.sort(arr);
        System.out.println("冒泡排序之后的数组：");
        printArr(arr);
    }


    /**
     * 冒泡排序算法——优化
     */
    public static void test03() {
        // 定义一个被排序的数组
        int[] arr = {3, 6, 1, 9, 4, 5, 7};
        //int[] arr = {1, 3, 4, 5, 6, 7, 9};
        System.out.println("冒泡排序之前的数组：");
        printArr(arr);
        // 记录比较次数
        int count = 0;
        // 采用冒泡排序算法进行排序
        // 经过n轮的一一对比  n 当前取值为 数组的元素个数
        for (int i = 0; i < arr.length; i++) {
            // 设置一个flag，记录本轮比较是否有元素发生了交换
            boolean exchangeFlag = false;
            // 使用for循环，进行相邻两个元素之间的比较互换
            for (int j = 0; j < arr.length - 1 - i; j++) { // 注意下标范围的控制，防止越界
                // 相邻元素之间进行比较交换
                if (arr[j] > arr[j + 1]) {
                    // 较大的元素向后移动
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    // 发生了元素交换，修改flag
                    exchangeFlag = true;
                }
                // 记录比较次数
                count++;
            }
            // 在本轮比较结束以后，查看是否发生了交换，如果没有发生交换，则说明整个数列已经有序，可以结束排序了
            if (exchangeFlag == false) {
                break;
            }
        }
        System.out.println("冒泡排序之后的数组：");
        printArr(arr);
        System.out.println("本次排序比较的次数为：" + count);
    }

    /**
     * 冒泡排序算法——优化
     */
    public static void test02() {
        // 定义一个被排序的数组
        int[] arr = {3, 6, 1, 9, 4, 5, 7};
        //int[] arr = {1, 3, 4, 5, 6, 7, 9};
        System.out.println("冒泡排序之前的数组：");
        printArr(arr);
        // 记录比较次数
        int count = 0;
        // 采用冒泡排序算法进行排序
        // 经过n轮的一一对比  n 当前取值为 数组的元素个数
        for (int i = 0; i < arr.length; i++) {
            // 使用for循环，进行相邻两个元素之间的比较互换
            for (int j = 0; j < arr.length - 1 - i; j++) { // 注意下标范围的控制，防止越界
                // 相邻元素之间进行比较交换
                if (arr[j] > arr[j + 1]) {
                    // 较大的元素向后移动
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
                // 记录比较次数
                count++;
            }
        }
        System.out.println("冒泡排序之后的数组：");
        printArr(arr);
        System.out.println("本次排序比较的次数为：" + count);
    }


    /**
     * 冒泡排序算法
     */
    public static void test01() {
        // 定义一个被排序的数组
        int[] arr = {3, 6, 1, 9, 4, 5, 7};
        System.out.println("冒泡排序之前的数组：");
        printArr(arr);
        // 记录比较次数
        int count = 0;
        // 采用冒泡排序算法进行排序
        // 经过n轮的一一对比  n 当前取值为 数组的元素个数
        for (int i = 0; i < arr.length; i++) {
            // 使用for循环，进行相邻两个元素之间的比较互换
            for (int j = 0; j < arr.length - 1; j++) { // 注意下标范围的控制，防止越界
                // 相邻元素之间进行比较交换
                if (arr[j] > arr[j + 1]) {
                    // 较大的元素向后移动
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
                // 记录比较次数
                count++;
            }
        }
        System.out.println("冒泡排序之后的数组：");
        printArr(arr);
        System.out.println("本次排序比较的次数为：" + count);
    }

    /**
     * 遍历数组元素，打印到控制台
     *
     * @param arr 被遍历的数组
     */
    public static void printArr(int[] arr) {
        // 数组的遍历
        for (int i = 0; i < arr.length; i++) {
            System.out.print(" " + arr[i]);
        }
        // 换行
        System.out.println();
    }

}
